function initialUpdateQueue(fiber) {
    // 创建一个新的更新队列
    const queue = {
        shared: {
            // pending是一个循环链表
            pending: null,
        },
    };
    fiber.updateQueue = queue;
};
function enqueue(fiber, update) {
    const updateQueue = fiber.updateQueue;
    const shared = updateQueue.shared;
    const pending = shared.pending;
    // 如果是第一个入队
    if (pending === null) {
        // 循环链表，只有一个的时候自己的next指向自己
        update.next = update;
    } else {
        // pending为上一次的最新update，pending.next指向的是第一个update
        update.next = pending.next;
        // 将update入列
        pending.next = update;
    }
    // pending永远指向最后一个update
    updateQueue.shared.pending = update;
};
function getStateFromUpdate(update, newState) {
    return Object.assign({}, newState, update.payload);
};
function processUpdateQueue(fiber) {
    const updateQueue = fiber.updateQueue;
    const pending = updateQueue.shared.pending;
    if (pending !== null) {
        updateQueue.shared.pending = null;
        const lastPendingUpdate = pending.next;
        const firstPendingUpdate = lastPendingUpdate.next;
        // 断开循环链表成为单向链表
        lastPendingUpdate.next = null;
        let newState = fiber.memoizedState;
        let update = firstPendingUpdate;
        while (update) {
            newState = getStateFromUpdate(update, newState);
            update = update.next;
        }
        fiber.memoizedState = newState;
    }
};
// 以下例子为2个update入队的情况
function createUpdate() { return {} };
let fiber = { memoizedState: { id: 1 } };
initialUpdateQueue(fiber);
// 第一个update
let update1 = createUpdate();
update1.payload = { name: 'rippi' };
enqueue(fiber, update1);
// 第二个update
let update2 = createUpdate();
update2.payload = { age: 18 };
enqueue(fiber, update2);


// 基于老状态，计算新状态
processUpdateQueue(fiber);
console.log(fiber);